import cv2 as cv
import  numpy as np
# ROI（region of interest），感兴趣区域。机器视觉、图像处理中，从被处理的图像以方框、圆、椭圆、不规则多边形等方式勾勒出需要处理的区域，称为感兴趣区域


def fill_color_demo(image):
    copying = image.copy()
    h, w = image.shape[:2]
    mask = np.zeros([h+2, w+2], np.uint8)  # mask必须行和列都加2，且必须为uint8单通道阵列
    # 为什么要加2可以这么理解：当从0行0列开始泛洪填充扫描时，mask多出来的2可以保证扫描的边界上的像素都会被处理
    cv.floodFill(copying, mask, (300, 300), (255, 255, 0), (50, 50, 50), (50, 50, 50), cv.FLOODFILL_FIXED_RANGE)
    # floodfill漫水填充法是在很多绘图软件中常用的填充算法，通常来说是自动选中与种子像素相连的区域，利用指定颜色进行区域颜色填充，常用于标记或分离图像的一部分
    # 原理：就是从一个点开始遍历附近像素点，填充成新的颜色，直到封闭区域内所有像素点都被填充成新颜色为止
    # 第一个参数表示输入/输出1或3通道，8位或浮点图像。
    # 第二个参数表示掩码，该掩码是单通道8位图像，比image的高度多2个像素，宽度多2个像素。填充时不能穿过输入掩码中的非零像素。
    # 第三个参数表示泛洪算法(漫水填充算法)的起始点。
    # 第四个参数表示在重绘区域像素的新值。
    # 第五个参数表示当前观察像素值与其部件邻域像素值或待加入该组件的种子像素之间的亮度或颜色之负差的最大值。
    # 第六个参数表示当前观察像素值与其部件邻域像素值或待加入该组件的种子像素之间的亮度或颜色之正差的最大值。
    # flags参数：操作标志符，包含三部分：
    # 　　　　低八位（0~7位）：用于控制算法的连通性，可取4（默认）或8。
    # 　　　　中间八位（8~15位）：用于指定掩码图像的值，但是如果中间八位为0则掩码用1来填充。
    # 　　　　高八位（16~32位）：可以为0或者如下两种标志符的组合：
    # 　　　　       FLOODFILL_FIXED_RANGE:表示此标志会考虑当前像素与种子像素之间的差，否则就考虑当前像素与相邻像素的差。
    #                FLOODFILL_MASK_ONLY:表示函数不会去填充改变原始图像,而是去填充掩码图像mask，mask指定的位置为零时才填充，不为零不填充。　　
    cv.imshow("copying", copying)


# 二值图像的填充
def fill_binary():
    image = np.zeros([400, 400, 3], np.uint8)
    image[100:300, 100:300] = 255
    mask = np.ones([402, 402], np.uint8)
    mask[101:301, 101:301] = 0  # mask指定的位置为零时才填充，不为零不填充。
    cv.floodFill(image, mask, (200, 200), (255, 255, 0), cv.FLOODFILL_MASK_ONLY)
    cv.imshow("fill_binary", image)


src = cv.imread("imgs/test005.jpg")
cv.imshow("angelababy", src)
fill_binary()
# fill_color_demo(src)
# face = src[50:215, 200:315]  # 截取图像中的一部分
# gray = cv.cvtColor(face, cv.COLOR_BGR2GRAY)
# backface = cv.cvtColor(gray, cv.COLOR_GRAY2BGR)  # 将灰度图像转换为RGB图像（但是仍然是灰色）
# src[50:215, 200:315] = backface  # 将原图的部分区域用上述得到的灰色的图像代替
# cv.imshow("angelababy_new", src)
cv.waitKey(0)
cv.destroyAllWindows()